/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package main;

import interfaceGrafica.Janela;
import java.awt.Color;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import logica.grafo.Aresta;
import logica.grafo.Grafo;
import logica.grafo.Vertice;
import logica.leitura.LeitorTXT;
import logica.leitura.LeitorXLS;
import org.jgraph.JGraph;
import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.DefaultGraphModel;
import org.jgraph.graph.GraphConstants;
import org.jgraph.graph.GraphModel;

/**
 *
 * @author Thiago
 */
public class Gerente {

    private Grafo grafoRedeTransporte;
    private Grafo grafoRedeDengue;
    private Grafo grafoTranspXDengue;
    private ArrayList<Grafo> listaGrafoRedeDengue;
    private ArrayList<Grafo> listaGrafoTranspXDengue;
    private Janela janela;
    private LeitorTXT leitorTXT;
    private LeitorXLS leitorXLS;
    private int numeroCidades;
    private final int numeroArestasRedeTransporte = 1252;
    private GraphModel modelTransporte;
    private JGraph graphTransporte;
    private GraphModel modelDengue;
    private ArrayList<JGraph> listaGraphDengue;
    private GraphModel modelTranspDengue;
    private ArrayList<JGraph> listaGraphTranspDengue;
    
    public Gerente() {
        this.iniciaGrafoTransporte();
        this.iniciaGrafoDengue();
        this.iniciaGrafoTranspDengue();

        janela = new Janela();
        janela.setVisible(false);
               
        try {
            leitorTXT = new LeitorTXT();
            leitorXLS = new LeitorXLS();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Gerente.class.getName()).log(Level.SEVERE, null, ex);
        }
        numeroCidades = 0;

    }

    public void iniciaGrafoTransporte() {
        grafoRedeTransporte = new Grafo();
        // Construct Model and Graph
        modelTransporte = new DefaultGraphModel();
        graphTransporte = new JGraph(modelTransporte);
        // Control-drag should clone selection
        graphTransporte.setCloneable(true);

        // Enable edit without final RETURN keystroke
        graphTransporte.setInvokesStopCellEditing(true);

        // When over a cell, jump to its default port (we only have one, anyway)
        graphTransporte.setJumpToDefaultPort(true);
    }

    public void iniciaGrafoDengue() {
        listaGrafoRedeDengue = new ArrayList<Grafo>();
        listaGraphDengue = new ArrayList<JGraph>();
        for (int i = 0; i < 52; i++) {
            JGraph graphDengue;
            grafoRedeDengue = new Grafo();
            // Construct Model and Graph
            modelDengue = new DefaultGraphModel();
            graphDengue = new JGraph(modelDengue);
            // Control-drag should clone selection
            graphDengue.setCloneable(true);

            // Enable edit without final RETURN keystroke
            graphDengue.setInvokesStopCellEditing(true);

            // When over a cell, jump to its default port (we only have one, anyway)
            graphDengue.setJumpToDefaultPort(true);
            
            listaGrafoRedeDengue.add(grafoRedeDengue);
            listaGraphDengue.add(graphDengue);
        }

    }

    public void iniciaGrafoTranspDengue() {
        listaGrafoTranspXDengue = new ArrayList<Grafo>();
        listaGraphTranspDengue = new ArrayList<JGraph>();
        for (int i = 0; i < 52; i++) {
            JGraph graphTranspXDengue;
            grafoTranspXDengue = new Grafo();
            // Construct Model and Graph
            modelTranspDengue = new DefaultGraphModel();
            graphTranspXDengue = new JGraph(modelTranspDengue);
            // Control-drag should clone selection
            graphTranspXDengue.setCloneable(true);

            // Enable edit without final RETURN keystroke
            graphTranspXDengue.setInvokesStopCellEditing(true);

            // When over a cell, jump to its default port (we only have one, anyway)
            graphTranspXDengue.setJumpToDefaultPort(true);

            listaGrafoTranspXDengue.add(grafoTranspXDengue);
            listaGraphTranspDengue.add(graphTranspXDengue);
        }
    }

    public void run(){
        
        leitorTXT.lerProximaLinha();
        numeroCidades = leitorTXT.getQuantidadeCidades();

        //Preenche a lista de vertices do grafo.
        for(int i = 0; i < numeroCidades; i++){
            leitorTXT.lerProximaLinha();
            grafoRedeTransporte.adicionaVertice(new Vertice(leitorTXT.getNomeCidade(), 1000-(leitorTXT.getPosicaoY()*1000), leitorTXT.getPosicaoX()*1000, 5, 5, leitorTXT.getNumeroCidade()));
            grafoRedeTransporte.getVertices().get(i).defineCor(Color.BLUE);
            
        }

        for (int i = 0; i < 52; i++) {
            listaGrafoRedeDengue.get(i).setVertices(grafoRedeTransporte.getVertices());
            listaGrafoTranspXDengue.get(i).setVertices(grafoRedeTransporte.getVertices());
        }
        //grafoTranspXDengue.setVertices(grafoRedeTransporte.getVertices());

        leitorTXT.lerProximaLinha();

        this.geraArestasTrasnporte();
        this.pintaVerticesTransporte();
        this.pintaArestasTransporte();

        //A partir daqui gera o grafo da dengue.
        this.geraArestasDengue();
        //this.pintaVerticesDengue();
        //this.pintaArestasDengue();

//        ArrayList<Integer> shortestPaths;
//
//        Dijkstra dijkstra = new Dijkstra();
//        shortestPaths = dijkstra.shortestPath(8, 236, d, dist, numeroCidades);
//
//        System.out.println(shortestPaths);
        
        janela.setGrafoTransporte(graphTransporte);
        janela.setGrafoDengue(listaGraphDengue);
        janela.setGrafoDengueTransp(listaGraphTranspDengue);
        janela.setListaGrafoRedeDengue(listaGrafoRedeDengue);
        janela.setListaGrafoTranspXDengue(listaGrafoTranspXDengue);
        janela.setGrafoRedeTransporte(grafoRedeTransporte);
        janela.setNumeroCidades(numeroCidades);
        janela.setNumeroArestasRedeTransporte(numeroArestasRedeTransporte);
        //janela.desenhaGrafo();
        janela.setVisible(true);

               
    }

    public void geraArestasTrasnporte() {
        // Imprime na tela as arestas presentes no arquivo txt.
        //Atributos: CidadeOrigem, CidadeDestino, Peso.
        for (int i = 0; i < numeroArestasRedeTransporte; i++) {
            leitorTXT.lerProximaLinha();
            DefaultEdge edge = new DefaultEdge();

            // Fetch the ports from the new vertices, and connect them with the edge
            edge.setSource(grafoRedeTransporte.getVertices().get(leitorTXT.getArestaOrigemCidade() - 1).getCell().getChildAt(0));
            edge.setTarget(grafoRedeTransporte.getVertices().get(leitorTXT.getArestaDestinoCidade() - 1).getCell().getChildAt(0));
            //System.out.println("Origem: " + leitor.getArestaOrigemCidade() + "\t Destino: " + leitor.getArestaDestinoCidade());

            grafoRedeTransporte.adicionaAresta(new Aresta(edge, leitorTXT.getPesoAresta(), grafoRedeTransporte.getVertices().get(leitorTXT.getArestaOrigemCidade() - 1).getNumeroCidade(), grafoRedeTransporte.getVertices().get(leitorTXT.getArestaDestinoCidade() - 1).getNumeroCidade()));

            GraphConstants.setLineEnd(edge.getAttributes(), GraphConstants.ARROW_NONE);
            GraphConstants.setEndFill(edge.getAttributes(), true);
        }
    }

    public void pintaArestasTransporte() {
        for (int w = 0; w < grafoRedeTransporte.getArestas().size(); w++) {
            graphTransporte.getGraphLayoutCache().insert(grafoRedeTransporte.getArestas().get(w).getCell());
            w++;
        }
    }

    public void pintaVerticesTransporte() {
        // Insert the cells via the cache, so they get selected
        for (int z = 0; z < grafoRedeTransporte.getVertices().size(); z++) {
            graphTransporte.getGraphLayoutCache().insert(grafoRedeTransporte.getVertices().get(z).getCell());
        }
    }

    //TODO: Montar as list com as semanas da dengue.
    public void geraArestasDengue() {
        for (int k = 0; k < 52; k++) {
            ArrayList<Integer> listaVerticeDengues = leitorXLS.geraVertices(k + 1);
            for (int i = 0; i < listaVerticeDengues.size(); i++) {
                for (int j = i; j < listaVerticeDengues.size(); j++) {

                    if (i != j) {
                        DefaultEdge edge = new DefaultEdge();
                        // Fetch the ports from the new vertices, and connect them with the edge
                        edge.setSource(listaGrafoRedeDengue.get(k).getVertices().get(listaVerticeDengues.get(i) - 1).getCell().getChildAt(0));
                        edge.setTarget(listaGrafoRedeDengue.get(k).getVertices().get(listaVerticeDengues.get(j) - 1).getCell().getChildAt(0));
                        //System.out.println("Origem: " + leitor.getArestaOrigemCidade() + "\t Destino: " + leitor.getArestaDestinoCidade());

                        listaGrafoRedeDengue.get(k).adicionaAresta(new Aresta(edge, 80, listaGrafoRedeDengue.get(k).getVertices().get(listaVerticeDengues.get(i) - 1).getNumeroCidade(), listaGrafoRedeDengue.get(k).getVertices().get(listaVerticeDengues.get(j) - 1).getNumeroCidade()));
                        GraphConstants.setLineEnd(edge.getAttributes(), GraphConstants.ARROW_NONE);
                        GraphConstants.setEndFill(edge.getAttributes(), true);
                    }
                }
            }
        }
    }

//    public void pintaArestasDengue() {
//        for (int k = 0; k < 52; k++) {
//            for (int w = 0; w < listaGrafoRedeDengue.get(k).getArestas().size(); w++) {
//                listaGraphDengue.get(k).getGraphLayoutCache().insert(listaGrafoRedeDengue.get(k).getArestas().get(w).getCell());
//            }
//        }
//    }
//
//    public void pintaVerticesDengue() {
//        // Insert the cells via the cache, so they get selected
//        for (int k = 0; k < 52; k++) {
//            for (int z = 0; z < listaGrafoRedeDengue.get(k).getVertices().size(); z++) {
//                listaGraphDengue.get(k).getGraphLayoutCache().insert(listaGrafoRedeDengue.get(k).getVertices().get(z).getCell());
//            }
//        }
//    }
}
